/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.ufrn.engcomp.pds.helloopc.modelo.negocio;

import br.ufrn.engcomp.pds.helloopc.modelo.dominio.ServidorOPC;
import br.ufrn.engcomp.pds.helloopc.modelo.dominio.TagOPC;
import br.ufrn.engcomp.pds.helloopc.modelo.negocio.excecao.NegocioException;
import br.ufrn.engcomp.pds.helloopc.modelo.negocio.servico.ServidorOPCServico;
import br.ufrn.engcomp.pds.helloopc.modelo.negocio.opc.ConexaoOPC;
import br.ufrn.engcomp.pds.helloopc.modelo.negocio.opc.OPCException;
import java.util.List;

/**
 *
 * @author Felipe Rivas
 */
public class ConectarServidorOPCNegocio {
    private ServidorOPCServico servidorOPCServico = new ServidorOPCServico();

    public List<ServidorOPC> listarServidoresOPC() {
        return servidorOPCServico.buscarTodos();
    }

    public void conectar(ServidorOPC servidorOPC) throws NegocioException {
        try {
            if (!ConexaoOPC.isConnected()) {
                ConexaoOPC.newInstance(servidorOPC.getHost(), servidorOPC.getServerName(), servidorOPC.getId());

                for (TagOPC tagOPC : servidorOPC.getTagsOPC()) {
                    ConexaoOPC.getCurrentInstance().addVariavel(tagOPC.getNome());
                }

                //conexaoOPC.addVariavel("ok.teste");

                ConexaoOPC.getCurrentInstance().conectar();

                //System.out.println(conexaoOPC.getVariavel("ok.teste"));
                //conexaoOPC.setVariavel("ok.teste", 25.0);
            } else if (!ConexaoOPC.getCurrentInstance().isInstance(servidorOPC.getHost(), servidorOPC.getServerName())) {
                ConexaoOPC.getCurrentInstance().desconectar();

                ConexaoOPC.newInstance(servidorOPC.getHost(), servidorOPC.getServerName(), servidorOPC.getId());

                for (TagOPC tagOPC : servidorOPC.getTagsOPC()) {
                    ConexaoOPC.getCurrentInstance().addVariavel(tagOPC.getNome());
                }

                ConexaoOPC.getCurrentInstance().conectar();
            }
        } catch (OPCException opcex) {
          throw new NegocioException("Não foi possível estabelecer conexão com o servidor OPC, motivo: " + opcex.getMessage());
        }
    }

    public void desconectar() {
        if (ConexaoOPC.getCurrentInstance() != null) {
            ConexaoOPC.getCurrentInstance().desconectar();
        }
    }

    public void finalizar() {
        this.desconectar();

        ConexaoOPC.finalizar();
    }

    public boolean estaConectado() {
        return ConexaoOPC.isConnected();
    }

    public String getNomeServidor() throws NegocioException {
        if (ConexaoOPC.isConnected()) {
            return servidorOPCServico.buscarPorID(ConexaoOPC.getCurrentInstance().getId()).getNome();
        }

        throw new NegocioException("Não está conectado a um servidor OPC.");
    }
}
